/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import clases.Almacen;
import clases.Articulo;
import clases.DetalleMovimiento;
import clases.Movimiento;
import clases.TipoMovimiento;
import com.alee.extended.date.WebDateField;
import com.alee.extended.panel.GroupPanel;
import com.alee.laf.button.WebButton;
import com.alee.laf.combobox.WebComboBox;
import com.alee.laf.label.WebLabel;
import com.alee.laf.optionpane.WebOptionPane;
import com.alee.laf.panel.WebPanel;
import com.alee.laf.rootpane.WebFrame;
import com.alee.laf.scroll.WebScrollPane;
import com.alee.laf.spinner.WebSpinner;
import com.alee.laf.table.WebTable;
import com.alee.laf.text.WebTextField;
import controlador.CtrlAlmacen;
import controlador.CtrlArticulo;
import controlador.CtrlMovimiento;
import controlador.CtrlTipoMovimiento;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SpinnerNumberModel;
import javax.swing.SpringLayout;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author togapaulo
 */
public class FrmMovimiento extends WebFrame implements ActionListener{

    private Movimiento movimiento;
    private DetalleMovimiento[] detallesMovimiento;
    private ArrayList<TipoMovimiento> tiposMovimiento;
    private ArrayList<Almacen> almacenes;
    private WebComboBox cbTipoMovimiento,
            cbOrigen,
            cbDestino;
    private WebDateField txtFecha;
    private WebTable tblArticulos;
    private WebTextField txtArticulo;
    private WebSpinner txtCantidad;
    private WebButton btnEliminar,
            btnAgregar,
            btnGuardar,
            btnCancelar;
    private WebPanel container;
    private WebLabel lblId;
    
    private CtrlMovimiento ctrlMovimiento;
    private CtrlTipoMovimiento ctrlTipoMovimiento;
    private CtrlArticulo ctrlArticulo;
    private CtrlAlmacen ctrlAlmacen;
    
    private Articulo articulo;
    
    private FrmBusquedaArticulo frmBusquedaArticulo;
    
    FrmMovimiento(){
        setTitle("Movimientos");
        setDefaultCloseOperation(WebFrame.DISPOSE_ON_CLOSE);
        setSize(400,600);
        setShowResizeCorner(false);
        setShowMaximizeButton(false);
        setLocationRelativeTo(null);
        initComponents();    
        System.out.println(this.tiposMovimiento.toArray()[1]);
    }
    
    private TipoMovimiento getTipoMovimiento(){
        for(TipoMovimiento tipoMovimiento : this.tiposMovimiento){
            if (this.movimiento.getTipoMovimiento().getIdTipoMovimiento() == tipoMovimiento.getIdTipoMovimiento()) {
                return tipoMovimiento;
            }
        }
        return null;
    }
    
    private Almacen getOrigen(){
        for(Almacen almacen : this.almacenes){
            if (this.movimiento.getAlmacenOrigen().getIdAlmacen() == almacen.getIdAlmacen()) {
                return almacen;
            }
        }
        return null;
    }
    
    private Almacen getDestino(){
        for(Almacen almacen : this.almacenes){
            if (this.movimiento.getAlmacenDestino().getIdAlmacen() == almacen.getIdAlmacen()) {
                return almacen;
            }
        }
        return null;
    }
    
    private void guardar(){
        if (this.movimiento == null) {
            this.movimiento = new Movimiento();
            this.movimiento.setIdMovimiento(-1);
        }
        prepararDatos();
        if (this.movimiento.getAlmacenDestino() == this.movimiento.getAlmacenOrigen()) {
                WebOptionPane.showMessageDialog(
                        this,
                        "Origen y Destino no pueden ser iguales",
                        "Error",
                        WebOptionPane.ERROR_MESSAGE
                );
        }else{
            if (this.movimiento.getIdMovimiento() == -1) {
                try {
                    /*try {
                    this.ctrlMovimiento.insert(this.movimiento, null, this.detallesMovimiento);
                    this.lblId.setText("ID: " + String.valueOf(this.movimiento.getIdMovimiento()));
                    WebOptionPane.showMessageDialog(this,
                    "Información registrada correctamente",
                    "Éxito",
                    WebOptionPane.INFORMATION_MESSAGE);
                    } catch (ClassNotFoundException | SQLException ex) {
                    System.out.print(ex.getMessage());
                    WebOptionPane.showMessageDialog(
                    this,
                    "No se pudo guardar la información, verificar e intentar nuevamente",
                    "Error",
                    WebOptionPane.ERROR_MESSAGE);
                    } */
                    
                    this.ctrlMovimiento.insert(this.movimiento, null, this.detallesMovimiento);
                    this.lblId.setText("ID: " + String.valueOf(this.movimiento.getIdMovimiento()));
                    WebOptionPane.showMessageDialog(this,
                            "Información registrada correctamente",
                            "Éxito",
                            WebOptionPane.INFORMATION_MESSAGE);
                } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(FrmMovimiento.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
    
    private void prepararDatos(){
        Date time = new Date();
        this.detallesMovimiento = new DetalleMovimiento[this.tblArticulos.getRowCount()];
        LocalDate fecha = time.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        this.movimiento.setTipoMovimiento((TipoMovimiento) this.cbTipoMovimiento.getSelectedItem());
        this.movimiento.setFecha(fecha);
        this.movimiento.setAlmacenOrigen((Almacen) this.cbOrigen.getSelectedItem());
        this.movimiento.setAlmacenDestino((Almacen) this.cbDestino.getSelectedItem());
        for (int i = 0; i < this.tblArticulos.getRowCount(); i++) {
            try {
                this.detallesMovimiento[i] = 
                        new DetalleMovimiento(
                                0,
                                this.movimiento,
                                (Articulo) this.ctrlArticulo.get(
                                    (int) this.tblArticulos.getModel().getValueAt(i, 0),
                                    null
                                ),
                                (int)this.txtCantidad.getValue()
                        );
            } catch (ClassNotFoundException | SQLException ex) {
                Logger.getLogger(FrmMovimiento.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == this.btnGuardar) {
            this.guardar();
            this.limpiarFormulario();
        }
    }

    private void initComponents(){
        try {
            this.ctrlArticulo = new CtrlArticulo();
            this.ctrlMovimiento = new CtrlMovimiento();
            this.ctrlTipoMovimiento = new CtrlTipoMovimiento();
            this.ctrlAlmacen = new CtrlAlmacen();
            this.container = new WebPanel();
            
            this.tiposMovimiento = this.ctrlTipoMovimiento.getTipoMovimientos("", null);
            this.almacenes = this.ctrlAlmacen.getAlmacenes("", null);
            this.cbTipoMovimiento = new WebComboBox(this.tiposMovimiento.toArray());
            System.out.println(this.tiposMovimiento.toArray()[1]);
            //Cambiar al de transferencia
            this.cbTipoMovimiento.setSelectedItem(this.tiposMovimiento.toArray()[1]);
            this.cbOrigen = new WebComboBox(this.almacenes.toArray());
            this.cbOrigen.setSelectedIndex(0);
            this.cbDestino = new WebComboBox(this.almacenes.toArray());
            this.cbDestino.setSelectedIndex(1);
            this.txtFecha = new WebDateField(new Date());
            this.txtArticulo = new WebTextField();
            this.txtArticulo.setInputPrompt("Artículos");
            this.txtCantidad = new WebSpinner();
            this.txtCantidad.setModel(new SpinnerNumberModel(1, 1,1000000, 1));
            this.btnAgregar = new WebButton("Agregar");
            this.tblArticulos = new WebTable();
            this.config_tabla();
            this.lblId = new WebLabel("Id: ");
            this.btnGuardar = new WebButton("Guardar");
            this.btnGuardar.addActionListener(this);
            this.btnCancelar = new WebButton("Cancelar");
            this.btnEliminar = new WebButton("Eliminar");
            this.btnEliminar.setVisible(false);
            
            this.add(this.container);
            this.container.setLayout(new BorderLayout());
            this.container.add(
                    new WebPanel(){
                        {
                            setLayout(new BorderLayout());
                            add(new WebPanel(){
                                {
                                    setLayout(new GridLayout(1,2));
                                    //setLayout(new FlowLayout(FlowLayout.LEFT));

                                    add(new GroupPanel(){
                                        {
                                            setLayout(new SpringLayout());
                                            add(new WebLabel("Tipo"));
                                            add(cbTipoMovimiento);
                                            add(new WebLabel("Origen"));
                                            add(cbOrigen);
                                            SpringUtilities.makeCompactGrid(this,
                                                    2, 2,
                                                    6, 6,
                                                    6, 6
                                            );
                                        }
                                    });
                                    add(new GroupPanel(){
                                        {
                                            setLayout(new SpringLayout());
                                            add(new WebLabel("Fecha"));
                                            add(txtFecha);
                                            add(new WebLabel("Destino"));
                                            add(cbDestino);
                                            SpringUtilities.makeCompactGrid(this,
                                                    2, 2,
                                                    6, 6,
                                                    6, 6
                                            );
                                        }
                                    });
                                }
                            }, BorderLayout.CENTER
                        );
                        add(new GroupPanel(){
                            {
                                //setLayout(new FlowLayout());
                                setLayout(new GridBagLayout());
                                GridBagConstraints gbc = new GridBagConstraints();
                                
                                gbc.gridx = 0;
                                gbc.gridy = 0;
                                gbc.gridwidth = 1;
                                gbc.weightx = 0.8;
                                gbc.fill = GridBagConstraints.HORIZONTAL;
                                add(txtArticulo, gbc);
                                gbc.gridx = 1;
                                gbc.gridy = 0;
                                gbc.gridwidth = 1;
                                gbc.weightx = 0.1;
                                add(txtCantidad, gbc);
                                gbc.gridx = 2;
                                gbc.gridy = 0;
                                gbc.gridwidth = 1;
                                gbc.weightx = 0.1;
                                add(btnAgregar, gbc);
                            }
                        }, BorderLayout.SOUTH);
                    }
                }, BorderLayout.NORTH
            );
            this.container.add(
                    new WebScrollPane(tblArticulos){
                        {
                            this.setMinimumHeight(200);
                        }
                    }
                    , BorderLayout.CENTER
            );
            this.container.add(new GroupPanel(){
                    {
                        setLayout(new BorderLayout());
                        add(lblId, BorderLayout.WEST);
                        add(new GroupPanel(){
                            {
                                this.setLayout(new FlowLayout(FlowLayout.RIGHT));
                                this.add(btnEliminar);
                                this.add(btnGuardar);
                                this.add(btnCancelar);
                            }
                        }, BorderLayout.EAST);
                    }
                }, BorderLayout.SOUTH
            );
            this.addWindowListener(new WindowAdapter(){
                @Override
                public void windowClosed(WindowEvent ev){
                    FrmPrincipal.bolFrmMovimiento = false;
                }
            });
            pack();
            this.txtArticulo.addActionListener((ActionEvent e) -> {
                if (this.cbOrigen.isEnabled()) {
                    this.frmBusquedaArticulo = new FrmBusquedaArticulo(this,(String)this.txtArticulo.getText(), (Almacen) this.cbOrigen.getSelectedItem());
                    this.frmBusquedaArticulo.setVisible(true);
                }else{
                    this.frmBusquedaArticulo = new FrmBusquedaArticulo(this,(String)this.txtArticulo.getText(), (Almacen) null);
                    this.frmBusquedaArticulo.setVisible(true);
                }
            });
            
            this.btnAgregar.addActionListener((ActionEvent e) -> {
                addFila();
            });
            
            this.btnCancelar.addActionListener((ActionEvent e) -> {
                this.dispose();
            });
            
            this.btnEliminar.addActionListener((ActionEvent e) -> {
                int row = tblArticulos.getSelectedRow();
                int opcion = WebOptionPane.showConfirmDialog(
                        this, 
                        "¿Desea eliminar este producto?",
                        "Advertencia",
                        WebOptionPane.WARNING_MESSAGE);
                if (opcion == 0) {
                    DefaultTableModel modelo = (DefaultTableModel) tblArticulos.getModel();
                    modelo.removeRow(row);
                    tblArticulos.setModel(modelo);
                }
                this.btnEliminar.setVisible(false);
            });
            
            this.cbTipoMovimiento.addActionListener((ActionEvent e) -> {
                this.inhabilitarCargoDescargo(this.cbTipoMovimiento.getSelectedItem());
            });
            
            this.cbOrigen.addActionListener((ActionEvent e) -> {
                this.vaciarTabla();
                if (this.cbDestino.getSelectedIndex() == this.cbOrigen.getSelectedIndex()) {
                    if (this.cbDestino.getSelectedIndex()==0) {
                        this.cbOrigen.setSelectedIndex(1);
                    }else{
                        this.cbOrigen.setSelectedIndex(0);
                    }
                }
            });
            
            this.cbDestino.addActionListener((ActionEvent e) ->{
                if (this.cbOrigen.isEnabled()) {
//                    Almacen destino = (Almacen) this.cbDestino.getSelectedItem();
//                    Almacen origen = (Almacen) this.cbOrigen.getSelectedItem();
                    if (this.cbDestino.getSelectedIndex() == this.cbOrigen.getSelectedIndex()) {
//                        WebOptionPane.showMessageDialog(
//                                this,
//                                "Origen y Destino no pueden ser iguales",
//                                "Error",
//                                WebOptionPane.ERROR_MESSAGE);
                        if (this.cbOrigen.getSelectedIndex()==0) {
                            this.cbDestino.setSelectedIndex(1);
                        }else{
                            this.cbDestino.setSelectedIndex(0);
                        }
                    }
                }
            });
            
            this.tblArticulos.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e){
                    if (e.getClickCount()==1) {
                        btnEliminar.setVisible(true);
                    }
                }
            });
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(FrmMovimiento.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private void config_tabla(){
        DefaultTableModel model = new DefaultTableModel();
        this.tblArticulos.setModel(model);
        model.addColumn("idArticulo");
        model.addColumn("Nombre");
        model.addColumn("Cantidad");
        this.tblArticulos.removeColumn(this.tblArticulos.getColumnModel().getColumn(0));
        Utilidades.resizeColumnWidth(this.tblArticulos);
        this.tblArticulos.setEditable(false);
    }
    
    private void addFila(){
        boolean flag = false;
        try {
            this.articulo = this.ctrlArticulo.getArticulos(this.txtArticulo.getText(), null).get(0);
            for (int i = 0; i < this.tblArticulos.getRowCount(); i++) {
                if ((int)this.tblArticulos.getValueAt(i,1)== this.articulo.getIdArticulo()) {
                    flag = true;
                }
            }
            if (flag == false) {
                ((DefaultTableModel)this.tblArticulos.getModel())
                    .addRow(new Object[]{
                        this.articulo.getIdArticulo(),
                        this.articulo.getNombre(),
                        this.txtCantidad.getValue()
                    });
                Utilidades.resizeColumnWidth(this.tblArticulos);
            }else{
                WebOptionPane.showMessageDialog(
                        this,
                        "El producto ya fue agregado",
                        "ERROR",
                        WebOptionPane.ERROR_MESSAGE);
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(FrmMovimiento.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void setTextArticulo(String texto){
        this.txtArticulo.setText(texto);
    }
    
    public void setModelCantidad(SpinnerNumberModel modelNumber){
        this.txtCantidad.setModel(modelNumber);
    }
    
    public void vaciarTabla(){
        DefaultTableModel modelo = new DefaultTableModel();
        this.tblArticulos.setModel(modelo);
        this.config_tabla();
    }
    
    public void limpiarFormulario(){
        this.cbTipoMovimiento.setSelectedIndex(0);
        this.cbOrigen.setSelectedIndex(0);
        this.cbDestino.setSelectedIndex(1);
        this.txtArticulo.setText("");
        this.txtCantidad.setValue(1);
        this.vaciarTabla();
    }
    
    public void inhabilitarCargoDescargo(Object item){
        if (item.toString().charAt(0) == 'C') {
            this.cbOrigen.setEnabled(false);
        }else{
            this.cbOrigen.setEnabled(true);
        }
        if (item.toString().charAt(0) == 'D') {
            this.cbDestino.setEnabled(false);
        }else{
            this.cbDestino.setEnabled(true);
        }
    }
}